#pragma GCC optimize(2)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <vector>

using namespace std;
using LL = long long;
const int N = 1e5 + 10;

int n;
int xor_sum[N];
int q[N];
int dp[N];
/*
    因为是上取整，因此可以想象成两种操作：1：选取长度为1的数组，进行异或，耗时为一秒
                                        2：选取长度为2的数组进行异或，耗时也为一秒

    观察可知，若存在一段区间使得 a(l) ^ a(l+1)^ a(l+2) ^ ... ^ a(r) = 0
              则该区间所需要的操作时间为 r - l 比原先的所需要的时间少 1
             因此从贪心的角度来看，这样的区间要尽可能多，且不相交

    dp[i]代表将 1-i变为0所需要的时间
    xor_sum[i] 代表1-i的异或前缀和， 若[l, r]的异或和为0，则xor_sum[r] == xor[l - 1];

    dp[i] = min(dp[i], j满足: a[j+1]^a[j+2]^a[j+3]...^a[i]  dp[j] + i - j - 1)
    map<int, int> key为xor的值，value保存的是最小的dp[j] - j的值

    if a[i] == 0 dp[i] = min(dp[i],  dp[i-1])
    else dp[i] = min(dp[i], dp[i - 1] + 1)


*/
int main(){
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    int T;
    scanf("%d", &T);
    while(T--){
        memset(dp, 0x3f, sizeof dp);
        xor_sum[0] = 0;

        scanf("%d", &n);
        for(int i = 1; i <= n; i ++){
            scanf("%d", &q[i]);
            xor_sum[i] = xor_sum[i - 1] ^ q[i];
        }

        map<int, int> mp;
        dp[0] = 0;  
        mp[0] = 0;    //指当没有元素时候

        for(int i = 1; i <= n; i ++){
            if(q[i] == 0){
                dp[i] = dp[i - 1];
            }else{
                dp[i] = dp[i - 1] + 1;
            }

            if(mp.count(xor_sum[i])){
                dp[i] = min(dp[i], mp[xor_sum[i]] + i - 1);
                mp[xor_sum[i]] = min(mp[xor_sum[i]], dp[i] - i);
            }else{
                mp[xor_sum[i]] = dp[i] - i;
            }
        }

        printf("%d\n", dp[n]);
    }


    return 0;
}